// 封装学生异步API

// 引入需要的包
var fs = require('fs')


// 读取对应的JSON文件路径
var DB_JSON_PATH = './db.json'

/**
 * 查询学生所有信息
 * @param function callback 
 */
exports.findAll = function (callback) {

    // 读取JSON数据文件，data类型为string
    fs.readFile(DB_JSON_PATH, 'utf8', function (err, data) {
        if (err) {
            return callback(err)
        }

        // 将students的JSON字符串转为对象
        var students = JSON.parse(data).students

        // 将students对象数据回调给使用者
        callback(null, students)
    })
}

/**
 * 根据ID查询对应学生信息
 * @param function callback 
 * @param number student_id
 */
exports.findByID = function (student_id, callback) {

    // 读取JSON数据文件，data类型为string
    fs.readFile(DB_JSON_PATH, 'utf8', function (err, data) {
        if (err) {
            return callback(err)
        }

        // 将students的JSON字符串转为对象
        var students = JSON.parse(data).students

        var result = students.find(function (item) {
            return item.id === parseInt(student_id)
        })

        // 将result对象数据回调给使用者
        callback(null, result)
    })
}

/**
 * 添加学生信息
 * @param function callback 
 * @param object student
 */
exports.save = function (student, callback) {

    // 读取JSON数据文件，data类型为string
    fs.readFile(DB_JSON_PATH, 'utf8', function (err, data) {
        if (err) {
            return callback(err)
        }


        // 将students的JSON字符串转为对象
        var students = JSON.parse(data).students

        // 处理id唯一的，不重复
        student.id = students[students.length - 1].id + 1

        // 把用户传递的对象保存到数组中
        students.push(student)

        // 把对象数据转换为字符串
        var result = JSON.stringify({
            students: students
        })

        // 把字符串保存在文件中
        fs.writeFile(DB_JSON_PATH, result, function (err) {
            // 错误就是把错误对象传递给它
            if (err) {
                return callback(err)
            }

            // 成功就没错，所以错误对象是null
            callback(null)
        })
    })
}

/**
 * 根据ID修改对应学生信息
 * @param function callback 
 * @param object student
 */
exports.updateById = function (student, callback) {
    // 读取JSON数据文件，data类型为string
    fs.readFile(DB_JSON_PATH, 'utf8', function (err, data) {
        if (err) {
            return callback(err)
        }

        // 将students的JSON字符串转为对象
        var students = JSON.parse(data).students

        // 将id改为数字类型，统一 格式  。（因为从表单获取到的数据都是字符串类型的）
        student.id = parseInt(student.id)
        // 你要修改谁，就需要把谁找出来
        // EcmaScript 6 中的一个数组方法：find
        // 需要接收一个函数作为参数
        // 当某个遍历项符合 item.id === student.id 条件的时候
        // find 会终止遍历，同时返回符合遍历项,
        var stu = students.find(function (item) {
            return item.id === student.id
        })

        // 遍历拷贝对象，这里修改的值是修改的students对象的原始值，因为stu引用的地址和students的地址相同。
        for (var key in student) {
            stu[key] = student[key]
        }

        // 把对象数据转换为字符串
        var result = JSON.stringify({
            students: students
        })

        // 把字符串保存在文件中
        fs.writeFile(DB_JSON_PATH, result, function (err) {
            // 错误就是把错误对象传递给它
            if (err) {
                return callback(err)
            }

            // 成功就没错，所以错误对象是null
            callback(null)
        })
    })
}

/**
 * 根据ID删除对应学生信息
 * @param function callback 
 * @param number student_id
 */
exports.deleteById = function (student_id, callback) {
// 读取JSON数据文件，data类型为string
fs.readFile(DB_JSON_PATH, 'utf8', function (err, data) {
    if (err) {
        return callback(err)
    }

    // 将students的JSON字符串转为对象
    var students = JSON.parse(data).students

    // findIndex 方法专门用来根据条件查询元素的下标
    var delete_id = students.findIndex(function (item) {
        return item.id === parseInt(student_id)
    })

    // 根据下标从数组中删除对应的学生对象
    students.splice(delete_id,1)

    // 把对象数据转换为字符串
    var fileData = JSON.stringify({
        students:students
    })

    // 把字符串保存到文件中
    fs.writeFile(DB_JSON_PATH,fileData,function (err) {
        if (err) {
            // 错误就是把错误对象传递给他
            return callback(err)
        }

        // 成功就没错，所以错误对象是 null
        callback(null)
    })
})
}
